//
//  WBNetworkManager.swift
//  微博
//
//  Created by 蒋丙爽 on 2021/4/25.
//  Copyright © 2021 Jiang. All rights reserved.
//


/*
 accessToken属性 1.目的：所有新浪微博的数据请求、都需要token(登录除外)
 tokenRequest:1.负责处理token字典2.简化其他的网络方法的调用
 request:封装AFN的GET/POST   1.隔离AFN 2.POST/GET完成回调是一样的
 */

import UIKit

enum WBHttpMethod {
    case GET
    case POST
}

///网络管理工具

class WBNetworkManager: AFHTTPSessionManager {

    //单例:静态  常量
    static let shared = WBNetworkManager()
    
    //访问令牌,所有网络请求，都基于此令牌(登录除外)
    //token 访问令牌有时限,默认用户是三天
    var accessToken : String? //= "2.00Vl6N4DrWtnCEfb9d4886430CEGF5"
    //用户微博 uid
    var uid : String? = "5365823342"
    
    ///用户登录标记【计算型属性】
    var userLogon : Bool {
        return accessToken != nil
    }
    
    
    //专门负责拼接 token 的网络请求方法
    func tokenRequest(method:WBHttpMethod = .GET,
                      URLString:String,
                      parameters:[String:AnyObject]?,
                      completion:@escaping(_ json:Any?,_ isSuccess:Bool)->()) {
        //处理 token 字典
        //0> 判断token是否为nil，为nil直接返回
        guard let token = accessToken else {
            // FIXME : 发送通知提示用户登录
            print("没有 token ! 需要登录")
            completion(nil,false)
            return;
        }
        //1> 判断 参数字典是否存在,如果为nil，应该新建一个字典
        var parameters = parameters
        if parameters == nil {
            //实例化字典
            parameters = [String:AnyObject]()
        }
        //2> 设置参数字典 - 代码在此处一定有值  上面有guard守护了
        parameters!["access_token"] = token as AnyObject
        
        //调用request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
        
    }
    
    func request(method:WBHttpMethod = .GET,
                 URLString:String,
                 parameters:[String:AnyObject]?,
                 completion:@escaping(_ json:Any?,_ isSuccess:Bool)->()) {
        //成功回调
        let success = {(task:URLSessionDataTask,json:Any?)->() in //()->() ：参数->返回值
            completion(json,true)
        }
        //失败回调
        let failure = {(task:URLSessionDataTask?,error:Error)->() in //()->() ：参数->返回值
            //针对 403 处理用户 token 过期
            //对于测试用户(应用程序还没有提交给新浪微博审核)每天的刷新量是有限的！
            //超出上限,token会被锁定一段时间
            //解决办法,新建一个应用程序
            // URLResponse 的子类 HTTPURLResponse  [父类往子类转 用类型转换]
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token 过期了")
                // FIXME : 发送通知,提示用户再次登录(本方法不知道被谁调用,谁接收到通知,谁处理)
            }
            print("网络请求错误\(error)")
            completion(nil,false)
        }
        
        
        
        if method == .GET {
            
            get(URLString, parameters: parameters, progress: nil, success: success,failure: failure)
            
//            get(URLString, parameters: parameters, progress: nil) { (task,json) in
//                completion(json,true)
//            } failure: { (task, error) in
//                print("网络请求错误\(error)")
//                completion(nil,false)
//            }
            
        }else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
//            post(URLString, parameters: parameters, progress: nil) { (task, json) in
//                completion(json,true)
//            } failure: { (task, error) in
//                print("网络请求错误\(error)")
//                completion(nil,false)
//            }

        }
        
    }
    
    func qingqiu() {
        
        
        post("http://10.127.133.54/api/message/push", parameters: ["nonce":"123","timestamp":"1615197305891","sign":"fad028e55ff92042ace67ef0dc7b66f2dda6983c","uid":"SM000001"], progress: nil) { task, json in
            print("--推送-->\(json)")
            
        } failure: { task, error in
            
        }

        
        
        
        
        
    }
    
    
    
}
